In a typical search application, such as an electronic discovery (e-discovery) application deployment, enterprise documents are archived in one or more repositories. In the case of an e-discovery application, if any litigation requires a subset of these documents to be produced, the underlying repository is queried for documents relevant to the litigation and these are then collected and produced as evidence. Retrieval of relevant documents is typically a multi-step process requiring multiple iterations. The initial query to a repository may be broad and would return a large set of documents that matches the query predicates. The returned documents are then put into a case created for the corresponding litigation. However, not all documents in the case may be relevant to the litigation, so before producing documents as evidence, further analysis is often needed. Different levels of review are carried out by reviewers of varying roles and levels of expertise to identify relevant and irrelevant documents. Reviewers might be assigned to different tasks in reviewing the documents. Analysis of a case could involve issuing more queries, some of which could be complex Boolean-logic queries. After multiple iterations of such reviews, the final set of documents to be produced as evidence is compiled.
To facilitate a collaborative workflow in an e-discovery environment, e-discovery products provide mechanisms by which reviewers can communicate with each other about individual documents by marking and annotating the documents. At any time during the case's lifecycle, markings can be added, modified or removed by anyone with privileges to do so. Since the markings are to be searchable, they are stored in fast data structures such as inverted indexes. But unlike typical inverted indexes, they are also to be updatable and dynamic to support simultaneous indexing and searching by multiple reviewers. When document search and document annotation are allowed to occur simultaneously, the result set of a search query with annotation constraints can change while it is being traversed. While this is desirable by some reviewers, it can be a problem for others, depending on the task a reviewer is performing when the change occurs. Possibly, it could require starting over to ensure that a task is done completely and correctly.